/********************************************
 * 功能说明: RSA签名验签类
 * 模块名称: 通用工具模块
 * 系统名称: java敏捷开发通用平台
 * 软件版权:
 * 系统版本: 1.0.0
 * 开发人员: zhangfb
 * 开发时间: 2016年12月23日 下午9:15:41
 * 审核人员:
 * 相关文档:
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.hyacinth.codec;

import com.hyacinth.constant.Constants;
import org.apache.commons.codec.binary.Base64;

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * RSA签名验签类
 * @author zhangfb
 * @version 1.0.0.1
 */
public class RSASignature {

	/**
	 * 签名算法
	 */
	public static final String SIGN_ALGORITHMS = "SHA1WithRSA";

	/**
	 * RSA私钥签名
	 * @param content 待签名数据
	 * @param privateKey RSA私钥
	 * @return 签名值
	 */
	public static String sign(String content, String privateKey) {
		return sign(content, privateKey, "UTF-8");
	}
	
	/**
	 * RSA私钥签名
	 * @param content 待签名数据
	 * @param privateKey RSA私钥
	 * @param encode 字符集编码
	 * @return 签名值
	 */
	public static String sign(String content, String privateKey, String encode) {
		try {
			PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
			KeyFactory keyf = KeyFactory.getInstance("RSA");
			PrivateKey priKey = keyf.generatePrivate(priPKCS8);
			java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
			signature.initSign(priKey);
			signature.update(content.getBytes(encode));
			byte[] signed = signature.sign();
			return Base64.encodeBase64String(signed);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
	
	/**
	 * RSA公钥验签
	 * @param content 待签名数据
	 * @param signStr 签名值
	 * @param publicKey RSA公钥
	 * @return 布尔值
	 */
	public static boolean checkSign(String content, String signStr, String publicKey) {
		return checkSign(content, signStr, publicKey, Constants.UTF_8);
	}

	/**
	 * RSA公钥验签
	 * @param content 待签名数据
	 * @param signStr 签名值
	 * @param publicKey RSA公钥
	 * @param encode 字符集编码
	 * @return 布尔值
	 */
	public static boolean checkSign(String content, String signStr, String publicKey, String encode) {
		try {
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			byte[] encodedKey = Base64.decodeBase64(publicKey);
			PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
			java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
			signature.initVerify(pubKey);
			signature.update(content.getBytes(encode));
			boolean bverify = signature.verify(Base64.decodeBase64(signStr));
			return bverify;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

}
